home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 401-425 / disk_421 / ezasm / ezasm.doc < prev    next >
Text File  |  1992-05-06  |  20KB  |  920 lines

  1.  
  2.  
  3.     EZAsm    Version 1.3        December '90   by Joe Siebenmann
  4.  
  5.  
  6.     DISCLAIMER:
  7.  
  8.     You have the right to freely use, copy and distribute this program
  9.     as long as the following conditions are met:
  10.  
  11.     1.  The program and documentation are not modified in any way.
  12.     2.  The program is not used or included in any package for profit
  13.         unless written consent from the author is obtained.
  14.  
  15.     NOTE: The author does not accept any responsibility for any damage
  16.         that might result from the use of this program.
  17.  
  18.  
  19.  
  20.     EZAsm was written to make programming in 68000 assembly language
  21.         much easier, for both assembly language programmers, and
  22.         those who may be interested in using the speed and compact
  23.         code that assembly language provides for a project.
  24.         EZAsm  combines parts of the "C" language with 68000
  25.         assembly, giving it the "feel" of a higher level language. 
  26.         The resulting code is optimized as much as possible.
  27.  
  28.  
  29.  
  30. Here are some of its advantages:
  31.  
  32.  
  33. -    It always converts your statement into the fastest possible
  34.         assembly statement(s), so you automatically write "good" code.
  35.  
  36. -    More structured.  Compare, and bit test statements can have
  37.         braces and "else" like "C".  Being able to use braces lets
  38.         you use assembly in a whole new way!
  39.  
  40. -    "C" like Amiga function calls!  Every 1.3 function in every
  41.         library is supported.  An XREF table is automatically
  42.         built and inserted.
  43.  
  44. -    Makes code MUCH more readable, for debugging etc.    
  45.  
  46. -    Enables you to code nearly TWICE as fast, with fewer syntax errors.
  47.  
  48. -    No more having to constantly look up which condition code to    
  49.         use for compares, bit tests, or maximum numbers for
  50.         "moveq" or "addq" etc.
  51.  
  52. -    You can insert normal assembly statements anywhere, for your
  53.         special needs.
  54.  
  55.  
  56.  
  57.     You need to know a little about assembly language, and "C"
  58.         operators, before you dive right in.  If you're new to
  59.         68000 assembly language, I suggest looking at one of the
  60.         many available books on the subject.  The included example
  61.         source programs can give you a good idea about:
  62.  
  63.  
  64. -    General statement syntax.
  65.  
  66. -    Use of the additional arguments, to "force" size etc.
  67.  
  68. -    Using assembly statements in your code.
  69.  
  70.  
  71. ****************************************    
  72.  
  73. Using EZAsm:
  74.  
  75.  
  76.  
  77. EZAsm filename.s
  78.  
  79.  
  80. Where filename is the name of your source file including any path.
  81.     Give your source file an extension ( .s etc. ) or your
  82.     linker will overwrite it.
  83.  
  84. It produces an output file called filename.asm .
  85.  
  86. Be sure the files "funcnm" & "funcdat" are in the same directory
  87.     as EZAsm.  Cd into this directory and you're ready to go.
  88.  
  89. Depending on which assembler you use on the final output file,
  90.     you may need to change the extension from .asm to .a or make minor
  91.     changes or additions to your source.  The code section has been made as
  92.     compatible as possible.  If your assembler complains, it's typically
  93.     something in the data section.
  94.  
  95.     Manx:   as window.asm
  96.             ln window.o -lc
  97.  
  98.  
  99.  
  100. *********************************
  101. *        Operand  Table         *
  102. *********************************
  103.  
  104.               Operand Type
  105.  
  106. Mode     [A] [B] [C] [D] [E] [F]
  107.  
  108. Dn        *   *   *   -   *   -
  109. An        *   -   *   -   -   -
  110. (An)      *   *   *   *   *   *
  111. (An)+     *   *   *   *   *   *
  112. -(An)     *   *   *   *   *   *
  113. d(An)     *   *   *   *   *   *
  114. d(An,Xn)  *   *   *   *   *   *
  115. abs.w     *   *   *   *   *   *
  116. abs.l     *   *   *   *   *   *
  117. d(PC)     *   -   -   -   *   *
  118. d(PC,Xn)  *   -   -   -   *   *
  119. d (immed) *   -   -   -   -   -
  120.  
  121.  
  122. declared variables:
  123.  
  124. "foo"  becomes  "foo(a5)"  ( d(An) )
  125.  
  126.  
  127. examples:
  128.  
  129. abs.w:  ($1f40)
  130.         (1024)
  131.         CLR_PUB     *1
  132.  
  133.  
  134. abs.l:  ($bfe001)
  135.         (12574721)
  136.         Max         *1
  137.  
  138.  
  139. d (immd):  $dff000
  140.            -1
  141.            512
  142.  
  143.  
  144. *1  Where these have been previously defined as "CLR_PUB  equ  $10001" etc.
  145.  
  146. **************************************
  147.  
  148.       ( decimal or hex )
  149.  
  150. #<1>   1 - 8
  151. #<2>   0 - 7
  152. #<3>   0 - 31
  153. #<4>   -128 - 127
  154. #<any>   any byte, word, or long size number
  155.  
  156.  
  157. Dn     d0 - d7
  158. An     a0 - a7
  159.  
  160.  
  161. {B}    B (byte) data size not allowed for An operands
  162.  
  163.  
  164. *****************************************
  165. *    legal     *  converted   *  legal  *
  166. *   operands   *     to       *  sizes  *
  167. *****************************************
  168.  
  169. Addition  Subtraction
  170.  
  171. ++
  172. --
  173.  
  174.     [C]         addq/subq       L,W,{B}
  175.  
  176. +=
  177. -=
  178.     
  179.     Dn   [A]    add/sub         L,W,B        
  180.  
  181.     [D]  Dn     add/sub         L,W,B
  182.  
  183.     An   [A]    adda/suba       L,W
  184.     
  185.     [B]  #<any> addi/subi       L,W,B        
  186.     
  187.     [C]  #<1>   addq/subq       L,W,{B}    
  188.  
  189.  
  190. Examples:
  191.  
  192.     Total ++    
  193.     d1 += 10
  194.  
  195. Optional Args:
  196.  
  197.     l, w, b 
  198.  
  199. **********************************
  200.  
  201. Multiplication   Division
  202.  
  203.  
  204. *=
  205. /=
  206.  
  207.     Dn  [E]     divu/mulu (default)   W
  208.     
  209.     Dn  [E]  s  divs/muls             W
  210.  
  211.  
  212.     ( SPECIAL:  Where # is a byte or word length number. ( higher could  
  213.         overshift the result )  The resulting code is larger then "mulu" or 
  214.         "muls" but will execute much faster.
  215.         ( it will default to a normal "mulu" or "muls"
  216.         if the number isn't "right" ) )
  217.  
  218.  
  219.     Dn *= #                           L
  220.  
  221.  
  222. Examples:
  223.  
  224.     d0 *= d1
  225.     d2 /= 2
  226.  
  227. Optional Args:
  228.  
  229.     w (default), s        
  230.  
  231. **********************************
  232.  
  233. And   Or   Exclusive Or
  234.  
  235.  
  236. &=
  237. |=
  238.  
  239.     [B]  #<any>     andi/ori        L,W,B    
  240.     
  241.     Dn   [E]        and/or          L,W,B
  242.     
  243.     [D]  Dn         and/or          L,W,B
  244.  
  245.  
  246. x=
  247.  
  248.     [B]  Dn         eor             L,W,B    
  249.     
  250.     [B]  #<any>     eori            L,W,B
  251.  
  252.  
  253. Examples:
  254.  
  255.     Mask &= %11010000
  256.     Flags |= $f0
  257.  
  258. Optional Args:
  259.  
  260.     l, w, b 
  261.  
  262. ***********************************
  263.  
  264. Shift  Left/Right
  265.  
  266.  
  267. <<
  268. >>
  269.  
  270.     Dn   Dn     lsl/lsr         L,W,B
  271.     
  272.     Dn   1-8    lsl/lsr         L,W,B
  273.     
  274.     [D]  1      lsl/lsr         L,W,B
  275.  
  276.              a  asl/asr
  277.  
  278.  
  279.     ( SPECIAL:  Normally you're limited to 1-8 and must use a
  280.         data register to hold higher.  In this statement  
  281.         the output is optimized, so it's faster, and saves
  282.         using a data register!  ( logical only ) )
  283.  
  284.  
  285.     Dn   1-31                   L
  286.  
  287.  
  288.  
  289. Examples:
  290.  
  291.     d2 << d0
  292.     d1 >> 4
  293.  
  294. Optional Args:
  295.  
  296.     l, w, b, a
  297.     ( logical is default )
  298.     
  299. ***********************************
  300.  
  301. Assign
  302.  
  303.  
  304. =    
  305.  
  306.     [B]  [A]    move            L,W,{B}
  307.     
  308.     An   [A]    movea           L,W
  309.     
  310.     Dn   #<4>   moveq           L
  311.  
  312.  
  313. Examples:
  314.  
  315.     temp = Total
  316.     (a1)+ = 0 w
  317.  
  318. Optional Args:
  319.  
  320.     l, w, b 
  321.  
  322. ***********************************
  323.  
  324. Compare
  325.  
  326.  
  327. >=
  328. <=
  329. !=
  330. >
  331. <
  332. =
  333.  
  334.     Dn    [A]      cmp          L,W,{B}
  335.     
  336.     An    [A]      cmpa         L,W
  337.     
  338.     [B]   #<any>   cmpi         L,W,B
  339.     
  340.     (An)+ (An)+    cmpm         L,W,B
  341.  
  342.  
  343.  
  344. Syntax types:
  345.  
  346.  
  347.     [opr] [op] [opr]   label
  348.  
  349.  
  350.  
  351.     [opr] [op] [opr]   {
  352.         .
  353.         .
  354.     }
  355.  
  356.  
  357.  
  358.     [opr] [op] [opr]   {
  359.         .
  360.         .
  361.     
  362.     } else {
  363.         .
  364.         .
  365.     }
  366.  
  367.  
  368. Example:
  369.  
  370.     Total >= 100 Over
  371.  
  372.  
  373. Optional Args: ( placed AFTER label or brace )
  374.  
  375.     l, w, b, s
  376.  
  377. ********************************************
  378.  
  379. Bit test
  380.  
  381.  
  382.  
  383.     Dn:0-31  =  0-1 label    btst.l     L
  384.     
  385.     Dn:Dn    =  0-1 label               L
  386.     
  387.     
  388.     [F]:0-7  =  0-1 label    btst.b     B    
  389.     
  390.     [F]:Dn   =  0-1 label               B
  391.  
  392.     
  393. ( You can also use braces "{" instead of a label, see
  394.     compare for use of braces )
  395.  
  396.  
  397. Examples:
  398.  
  399.     d1:0 = 1 CalcRtn
  400.  
  401.     ($bfe001):6 = 0 LMBDown
  402.  
  403.     d2:d0 = 1 ItsSet 
  404.  
  405.  
  406. Optional Args:
  407.  
  408.     ( ignored )
  409.     
  410. Rules:
  411.  
  412. -    No spaces inside first operand.
  413.  
  414. -    Only "=" is allowed.
  415.  
  416. -    Right operand can only be 0 or 1.
  417.  
  418.  
  419. ****************************************
  420.  
  421. Additional Arguments:
  422.  
  423.  
  424. b   forces operation to be byte
  425.  
  426. w     "       "        "   word
  427.  
  428. l     "       "        "   long
  429.  
  430. a    arithmetic shift       ( <<, >> )       ( logical is default )
  431.  
  432. s    signed                 ( *=, /= , compares )
  433.  
  434.  
  435. ( these are RESERVED and can't be used as variables, or labels
  436.     ( unless you use upper case ) ) 
  437.  
  438. ******************************************************
  439.  
  440. Functions:
  441.  
  442.  
  443. Syntax types:
  444.  
  445.     CloseWindow( Window )
  446.  
  447.     Buf = AllocMem( 512 $10001 )
  448.  
  449.     Permit( )
  450.  
  451.  
  452.  
  453. Example:
  454.  
  455. --------------------------------
  456.  
  457. dosname        dc.b    "dos.library",0
  458. fname        dc.b    "df0:myfile",0
  459.  
  460. CLEAR_PUBLIC    equ    $10001
  461. OLD        equ    1005
  462.  
  463.  
  464. LONG    _DosBase FHandle num Rbuf 
  465.  
  466.  
  467.         _DosBase = OpenLibrary( #dosname 0 ) 
  468.         beq     Exit
  469.  
  470.         Rbuf = AllocMem( 100 #CLEAR_PUBLIC )
  471.         beq  Exit
  472.  
  473.         FHandle = Open( #fname #OLD )                 
  474.         beq  Exit
  475.  
  476.         d3 = 100    ; preload D3   *1
  477.         num = Read( d0 Rbuf * )
  478.  
  479.             .
  480.             .
  481.             .
  482.  
  483.  
  484.  
  485. *1   normally you wouldn't need to do this, it's only an example..
  486.  
  487. ---------------------------------
  488.  
  489.  
  490. -    You must first do an OpenLibrary( ) to access functions in
  491.         a library.  Functions in ConsoleDevice are accessed 
  492.         differently.  See the ConsoleDevice section in the RKM.
  493.         Functions in ExecBase are always accessible and don't
  494.         need to be opened.
  495.         The library bases MUST be named:
  496.  
  497.  
  498.     _DiskfontBase
  499.     _DosBase
  500.     _ExpansionBase
  501.     _GfxBase
  502.     _IconBase
  503.     _IntuitionBase
  504.     _LayersBase
  505.     _MathBase
  506.     _MathIeeeDoubBasBase
  507.     _MathIeeeDoubTransBase
  508.     _MathTransBase
  509.     _PotgoBase
  510.     _RomBootBase
  511.     _TimerBase
  512.     _TranslatorBase
  513.  
  514.  
  515.  
  516. -    Unfortunately the leading underscores are necessary so you can use
  517.         includes without your assembler complaining.  Some library bases
  518.         ( IntuitionBase, ExecBase, GfxBase, ExpansionBase, RomBootBase )
  519.         are already defined in some .i's resulting in "multiply defined
  520.         symbol" errors.
  521.  
  522. -    You might notice that ExecBase is missing.  It isn't needed.
  523.         ( it's loaded with "movea.l $4,a6" )
  524.  
  525.  
  526.                    Permit( )
  527.               OpenLibrary( #dosname 0 )
  528.                         ^ ^          ^
  529.                no space | | space    | space
  530.  
  531. -    The function name must be followed immediately with "(" ( no
  532.         spaces between ) and then followed by a space or tab.
  533.         If the function has no arguments, it still needs a space in the
  534.         middle.  Arguments must be separated with a space or tab.
  535.  
  536.  
  537. Arguments:
  538.  
  539. -    If your argument is already in a DIFFERENT data or address register,
  540.         you can pass it as an argument.  Often a previous function will put  
  541.         results in D0, so just pass d0.  If the proper register is already
  542.         loaded just pass "*".  The above example shows both of these.
  543.  
  544.         ( if you pass it the same register it uses, it will be skipped...
  545.         func defined as:  Lock( D1 D2 )  "Flock = Lock( d1 -2 )"
  546.         arg "d1" will be skipped )
  547.  
  548.  
  549. -    If you need a pointer to a newwindow, filename, library name, etc.
  550.         use "#dosname" etc. like the example above. It'll load its address
  551.         ( pointer ) into a data or address register.
  552.  
  553.  
  554.     All functions within these ( 1.3 ) libraries are supported:
  555.  
  556.         ConsoleDevice
  557.         DiskfontBase        
  558.         DOSBase
  559.         ExecBase  ( SysBase )
  560.         ExpansionBase
  561.         GfxBase
  562.         IconBase
  563.         IntuitionBase
  564.         LayersBase
  565.         MathBase
  566.         MathIeeeDouBasBase
  567.         MathIeeeDoubTransBase
  568.         MathTransBase
  569.         PotgoBase
  570.         RomBootBase
  571.         TimerBase
  572.         TranslatorBase
  573.  
  574.  
  575. -    It keeps track of the current library base.  As long as no user labels,
  576.         or close braces ("}") are hit, it will skip re-loading the base
  577.         register for functions which have the same library base.
  578.  
  579. -    The file "funcnm" contains a list of every function that is supported.
  580.  
  581.  
  582. **************************************************
  583.  
  584. Optimizations:
  585.  
  586.  
  587.   STATEMENT          BECOMES        NOTE
  588.  
  589.  
  590.    An = 0          sub.l An,An
  591.  
  592.    [B] = 0         clr [B]          1
  593.  
  594.  
  595.  ( compares )
  596.  
  597.    [B] = 0
  598.    [B] != 0        tst [B]
  599.                    bcc label
  600.  
  601.    ----------------------------------
  602.  
  603.    [B] += #
  604.    [B] -= #
  605.  
  606.    [B] &= #   
  607.    [B] |= #
  608.    [B] x= #
  609.  
  610.    [B] = #         moveq   #,d7     2
  611.                    [opr].l d7,[B]
  612.  
  613.  
  614.    ( compares )
  615.  
  616.    dn .. # label   moveq   #,d7     2
  617.                    cmp.l   d7,dn
  618.                    bcc     label
  619.  
  620.    an .. # label   moveq   #,d7     2
  621.                    cmpa.l  d7,an
  622.                    bcc     label
  623.  
  624.    ----------------------------------
  625.  
  626.    Dn << 1-31
  627.    Dn >> 1-31                       3, 2
  628.  
  629.    An += #1        lea  n(An),An
  630.    An -= #1        lea  -n(An),An   4, 2
  631.  
  632.    An = #2         lea  n,An        5, 2
  633.  
  634.    Dn *= #1                         6
  635.  
  636.    
  637.  
  638. # = 1-127    ( #<4> if appropriate )
  639.  
  640. #1 = any byte or word length number
  641.  
  642. #2 = any byte, word, or long length number
  643.  
  644.  
  645.  
  646. Notes:
  647.  
  648. 1    For byte and word sizes the code size is smaller, for long,
  649.         its smaller and faster. ( then "move #0,[B]" )            
  650.  
  651. 2    Only apply to long sized operations.
  652.  
  653. 3    The resulting instructions are combinations of "swap", "clr.w",
  654.         "add.l", "lsr" or "lsl".
  655.  
  656. 4    ( 1-8 handled by "addq", "subq" )
  657.  
  658. 5    ( 0 handled by "sub.l An,An" )
  659.  
  660. 6    The resulting instructions are combinations of "move.l", "asl.l", 
  661.         "asr.l", "add.l".        
  662.  
  663.  
  664. ********************************************
  665.  
  666. General Info:
  667.  
  668.  
  669. -    Statements can be indented as you like.  Operands, operator,
  670.         and arguments must be separated by at least one space or tab. 
  671.  
  672. -    Braces can be nested up to 30 deep.
  673.     
  674. -    Only one statement per line.
  675.  
  676. -    If you declare variables or use function call's, the first statement
  677.         in your code must be an "EZAsm statement" so it knows when
  678.         to insert the XREF's and/or get stack frame for the
  679.         variables.  ( comments or assembly directives placed between
  680.         your variables and the start of your code will be out of place
  681.         in the output file )
  682.  
  683. -    Comments at 1st column must begin with "*" or ";".  Comments after
  684.         statements must be begin with ";" and be separated from last
  685.         argument, or operand.
  686.         ( both types are transferred to output file ( some may not ))
  687.  
  688. -    Operands supported: octal: @141  hex: $61  binary: %1100001  ASCII: 'a'
  689.         and decimal: 97   ASCII strings can contain a maximum of 4
  690.         characters, with no quotes within quotes permitted.    
  691.  
  692. -    To make labels and symbols as compatible as possible, they arn't
  693.         checked for illegal characters.  Typically the 1st character
  694.         must be a letter, underscore "_", or a period "." .
  695.         The rest of the characters can be any of these plus 0-9.
  696.  
  697. -    Labels and symbols can have an unlimited length.  ( check your
  698.         assembler to find what length they are significant to
  699.         ( usually around 30 ) )
  700.  
  701. -    Labels that don't begin at column 1 should be followed immediately
  702.         with ":".
  703.  
  704. -    Local labels ( "2$   d1 = 0" ) are supported.
  705.  
  706. -    No need to put in the usual "moveq #0,d0", "rts" at the end of your
  707.         code, its part of the closing block of code it inserts to
  708.         free the variables.
  709.  
  710. -    D7 is used as a scratch register for some optimizations, so be
  711.         careful if you use it.
  712.  
  713. -    Labels that it generates for braces are in the range ".laaa" to ".lzzz",
  714.         so try to avoid using them.  ( upper case is OK )
  715.  
  716. -    "SP", "PC", "CCR", "SR" & "USP" are supported, but you must ensure
  717.         the size is legal as no checks are made.
  718.         ( must be upper case )
  719.  
  720. -    For best viewing of output file set your tabs to 8 spaces.
  721.         ( printing should be fine )
  722.  
  723.  
  724. IMPORTANT! :
  725.  
  726. Use of register A5 is RESERVED!
  727.  
  728. ( it contains the base address for variable storage )
  729.  
  730.  
  731. ********************************
  732.  
  733. Variable Declaration:
  734.  
  735.  
  736. LONG    foo Save[10] bar ...
  737. WORD    DMASave ...
  738. BYTE    Sw ...
  739.  
  740.  
  741. -    "xxx[n]" reserves n consecutive blocks of given size, with
  742.         "xxx" pointing to 1st byte.
  743.  
  744. -    You're limited to 14 variables per line.
  745.  
  746. -    No other statement types may occur between these lines.
  747.  
  748. -    Variables must be separated by at least one space, or tab.
  749.  
  750. -    To keep things word aligned, if an odd number of bytes are    
  751.         declared in BYTE, an extra byte will be added.  This
  752.         will offset the next "equ" by one.
  753.         ( in the case of "BYTE    Count foo buf[3]" ( 5 bytes )
  754.         an extra would be added )
  755.  
  756. -    Variables are stored on the stack, which has a lot of garbage
  757.         in it.  Be sure to properly initialize them.  
  758.  
  759. -    Any number of these can be used, in any order.    
  760.  
  761. -    Must occur JUST BEFORE your program code.
  762.  
  763. -    Must begin at 1st column, with LONG, WORD, or BYTE in upper case.
  764.  
  765.  
  766. ************************************************
  767.  
  768. How to get what you need, hints, etc.:
  769.  
  770.  
  771. -    Using "ENDS":    Its safer to put all your data AFTER your code
  772.         so it can't accidentally be executed when it runs.
  773.         To do this, put "ENDS" ( END Source ) after your code,
  774.         ( signals the closing block of code to free the variables
  775.         to be output ) and "END" at the very bottom.  "END" must
  776.         allways be at the bottom.
  777.         ( see the example source "window.s" which uses this )
  778.  
  779. -    Instruction size:    In most cases you won't need a size argument.
  780.         It knows the size of the variables, address and data registers,
  781.         and is usually smart enough to know what size to use.
  782.         It determines the size of data by its actual value, not its
  783.         physical size. ( $0020  %11010000  $12  125  are all BYTE size )
  784.         If the data is smaller than the instruction size you want,
  785.         ( d1 = $0020 w ) or it can't know an operands size
  786.         ( (a2)+ = 3(a0) l ) you'll need to give it a size argument.
  787.  
  788. -    Since "(a1)" refers to the CONTENTS of the byte, word, or long
  789.         that a1 points to, "($dff180)" is used in a similar way.
  790.         "move.w  $dff01e,d0" would become, "d0 = ($dff01e) w".
  791.         ( decimal addr's are also valid: "(4)", "(256)" )
  792.  
  793. -    When numbers are used as operands "$fe02" or "37", they are converted
  794.         to "#$fe02", "#37".  ( when "$2f(a2)" or "15(a0)"
  795.         are used, they are left AS IS ( see below ))
  796.  
  797. -    Operands that it DOESN'T RECOGNIZE, doesn't match with any
  798.         declared LONG, WORD, BYTE, or standard "(a1)+" etc., get
  799.         output AS IS.  This is VERY USEFUL when you need operands like:
  800.         "#intuiname", "wd_UserPort(a1)", "$20(a1)", "DMACON(a6)"  etc.
  801.  
  802. -    Most statements set condition code flags on the result of the
  803.         operation.  Often, instead of using a compare to check the
  804.         result, you can use an assembly instruction, branching on
  805.         the state of a condition code flag! ( You need to check
  806.         what flags are set ( if any ) for an instruction )
  807.  
  808. -    If at any time you're unsure of what a statement is being
  809.         output as, or want to check something out, just look
  810.         at the output file.  Leave a blank line before and after
  811.         the statement to see what it's output as.
  812.  
  813. -    I think it's a good idea to get away from using include files.
  814.         It speeds up the assembler tremendously.  Most assembly
  815.         source files I see do this.
  816.  
  817.  
  818. ****************************************
  819.  
  820. Errors:
  821.  
  822.  
  823. "Illegal argument"
  824.  
  825.     The argument found was not valid for the operator.  See
  826.     the list of "Optional Args" for the operator.  It must
  827.     be lower case, and be separated from the operands
  828.     by at least a space or a tab.
  829.     
  830. "Illegal operand"
  831.  
  832.     One, or both, of the operands are:  not valid for the operator, have
  833.     an invalid number, or byte size was specified for an "An" operand ({B}).
  834.     In most cases it's looking for "Dn" or "An" as one of the operands.
  835.     ( look under the "legal operands" of the operator for a
  836.     valid combination )
  837.  
  838. "Illegal size"
  839.  
  840.     The argument size you specified is not valid for the operator.    
  841.     Check the "legal sizes" for the operator.
  842.     
  843. "Needs size argument"    
  844.  
  845.     It doesn't have enough size information about the operands to
  846.     calculate an instruction size.  You need to add an l, w, or b argument.
  847.  
  848. "Label not found"
  849.  
  850.     No label matching your label argument was found.    
  851.  
  852. "Brace mismatch"
  853.  
  854.     Checks are made when a closing brace ( "}" ) is hit, and when "END"
  855.     is hit.  If the brace stack is "messed up" at that time, an error 
  856.     is given.  If "}" is shown, look from there up.  Both "}" and "END"
  857.     may appear.  If just "END", look for a "{" or "} else {" without a
  858.     matching "}".
  859.  
  860. "Function not found"
  861.  
  862.     No function matching your function name was found.  Check case and    
  863.     spelling of function name, and be sure there isn't a space before
  864.     the "(".  Check the list of supported function names in the
  865.     file "funcnm".
  866.  
  867. "Function argument count incorrect"
  868.  
  869.     Check the number of arguments you used for the function.  Too many
  870.     or not enough were used.
  871.  
  872.  
  873.  
  874. Warnings:
  875.  
  876.  
  877. "Variable size mismatch"
  878.  
  879.     Operation size is different from variable size.
  880.     The result may not be placed where you expect.
  881.     ( if "foo" is LONG and your instruction is "foo = $01 b" the
  882.     $01 will be placed in the UPPER MOST BYTE  N O T  the lower
  883.     most byte of "foo" as you might have wanted.
  884.     ( "foo = $01" would do it ) )
  885.  
  886.  
  887. *************************************************************************
  888. *************************************************************************
  889.  
  890.  
  891.     I hope you find this program useful.  If you have any thoughts
  892.         about it, bugs, or something you'd like to see in a future
  893.         version, I would appreciate hearing from you!
  894.  
  895.  
  896. I can be contacted at:
  897.  
  898.  
  899. ( till around spring of '91 )
  900.  
  901. Joe Siebenmann
  902. 8303 Old Tree Ct.
  903. Springfield, VA  22153
  904. (703) 455-4982
  905.  
  906.  
  907. ( anytime )
  908.  
  909. PLINK:    IGZ798
  910.  
  911.  
  912.  
  913. Happy Programming!
  914.  
  915.  
  916.  
  917.  
  918.  
  919.  
  920.